package com.gipson.amc.utils.strprocess;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * 字符串处理工具类。
 *
 * @author cjw 2019-07-11
 */
public class StrUtil {
	
	/**
	 * 将object转化为jsonstr。
	 *
	 * @param object
	 * @return
	 */
	public static String tojsonstr(Object object) {
		String str = null;
		str = JSON.toJSONString(object, SerializerFeature.WriteMapNullValue);
		return str;
	}
	
	/**
	 * 将object转化为jsonstr,不含null值。
	 *
	 * @param
	 * @return
	 * @author cjw 2020-06-03
	 */
	public static String tojsonstrWithoutNullValue(Object object) {
		String str = null;
		str = JSON.toJSONString(object);
		return str;
	}
	
	/**
	 * 将object转化为格式化的(SerializerFeature.PrettyFormat)jsonstr。
	 *
	 * @param object
	 * @return
	 */
	public static String toPrettyJsonStr(Object object) {
		String str = null;
		str = JSON.toJSONString(object, SerializerFeature.WriteMapNullValue, SerializerFeature.PrettyFormat);
		return str;
	}
	
	/**
	 * 将object转化为格式化的(SerializerFeature.PrettyFormat)jsonstr,不含null值。
	 *
	 * @param
	 * @return
	 * @author cjw 2020-06-03
	 */
	public static String toPrettyJsonStrWithoutNullValue(Object object) {
		String str = null;
		str = JSON.toJSONString(object, SerializerFeature.PrettyFormat);
		return str;
	}
	
	/**
	 * 输出object信息,输出格式《"prefix="+jsonstr》。
	 * <br>将object转换成字符串jsonstr,并输出到控制台,并返回该字符串jsonstr(不含前缀prefix)。
	 * <br>前缀prefix用于控制台输出展示。
	 *
	 * @param prefix
	 * @param object
	 * @return
	 */
	public static String prettyPrint(String prefix, Object object) {
		String str = null;
		str = JSON.toJSONString(object, SerializerFeature.WriteMapNullValue, SerializerFeature.PrettyFormat);
		System.out.println(prefix + "=" + str);
		return str;
	}
	
	/**
	 * 输出object信息,输出格式《"prefix="+jsonstr》,不含null值。
	 * <br>将object转换成字符串jsonstr,并输出到控制台,并返回该字符串jsonstr(不含前缀prefix)。
	 * <br>前缀prefix用于控制台输出展示。
	 *
	 * @param
	 * @return
	 * @author cjw 2020-06-03
	 */
	public static String prettyPrintWithoutNullValue(String prefix, Object object) {
		String str = null;
		str = JSON.toJSONString(object, SerializerFeature.PrettyFormat);
		System.out.println(prefix + "=" + str);
		return str;
	}
	
	/**
	 * 输出object信息,输出格式《"[2019-11-22 10:00:00] prefix="+jsonstr》。
	 * <br>将object转换成字符串jsonstr,并输出到控制台,并返回该字符串jsonstr(不含前缀prefix)。
	 * <br>前缀prefix用于控制台输出展示。
	 *
	 * @param prefix
	 * @param object
	 * @return
	 */
	public static String prettyPrintWithTime(String prefix, Object object) {
		String str = null;
		String str_final = null;
		str = JSON.toJSONString(object, SerializerFeature.WriteMapNullValue, SerializerFeature.PrettyFormat);
		str_final = "[" + TimeConvert.getCurrentTime() + "] " + prefix + "=" + str;
		System.out.println(str_final);
		return str;
	}
	
	/**
	 * 输出object信息,输出格式《"[2019-11-22 10:00:00] prefix="+jsonstr》,不含null值。
	 * <br>将object转换成字符串jsonstr,并输出到控制台,并返回该字符串jsonstr(不含前缀prefix)。
	 * <br>前缀prefix用于控制台输出展示。
	 *
	 * @param
	 * @return
	 * @author cjw 2020-06-03
	 */
	public static String prettyPrintWithTimeWithoutNullValue(String prefix, Object object) {
		String str = null;
		String str_final = null;
		str = JSON.toJSONString(object, SerializerFeature.PrettyFormat);
		str_final = "[" + TimeConvert.getCurrentTime() + "] " + prefix + "=" + str;
		System.out.println(str_final);
		return str;
	}
	
	/**
	 * 将信息object输出到前端页面。
	 *
	 * @param response
	 * @param object
	 */
	public static void print2View(HttpServletResponse response, Object object) {
		String jsonstr = tojsonstr(object);
		try {
			response.getWriter().print(jsonstr);
			response.getWriter().flush();
			response.getWriter().close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 将"错误提示信息"输出到前端。
	 *
	 * @param response
	 * @param errMsg
	 */
	public static void printToViewError(HttpServletResponse response, String errMsg) {
		Map<String, Object> map = new LinkedHashMap<>();
		map.put("code", 0);
		map.put("success", false);
		map.put("msg", errMsg);
		print2View(response, map);
	}
	
	/**
	 * 将"错误提示信息"输出到前端。
	 *
	 * @param
	 * @return
	 * @author cjw 2019-07-23
	 */
	public static void printToViewError(HttpServletResponse response, Exception e) {
		Map<String, Object> map = new LinkedHashMap<>();
		map.put("code", 0);
		map.put("success", false);
		//msg
		String msg = null;
		msg = "传入的参数有误!" + (StrUtil.isEmpty(e) ? "" : e.toString());
		map.put("msg", msg);
		print2View(response, map);
	}
	
	/**
	 * 将"成功提示信息"输出到前端。
	 *
	 * @param response
	 * @param successMsg
	 */
	public static void printToViewSuccess(HttpServletResponse response, String successMsg) {
		Map<String, Object> map = new LinkedHashMap<>();
		map.put("code", 1);
		map.put("success", true);
		map.put("msg", successMsg);
		print2View(response, map);
	}
	
	/**
	 * 将"成功提示信息"输出到前端。
	 *
	 * @param response
	 */
	public static void printToViewSuccess(HttpServletResponse response) {
		Map<String, Object> map = new LinkedHashMap<>();
		map.put("code", 1);
		map.put("success", true);
		map.put("msg", "请求成功!");
		print2View(response, map);
	}
	
	/**
	 * 请求成功,并将"查询结果"输出到前端。
	 *
	 * @param
	 * @return
	 * @author cjw 2019-07-25
	 */
	public static void printToViewSuccess(HttpServletResponse response, Object object) {
		Map<String, Object> map = new LinkedHashMap<>();
		map.put("code", 1);
		map.put("success", true);
		map.put("msg", "请求成功!");
		map.put("data", object);
		print2View(response, map);
	}
	
	
	/**
	 * 若str==null,或str中each code<='\u005Cu0020'(the space character),返回true。
	 *
	 * @param str
	 * @return
	 */
	public static boolean isEmpty(String str) {
		if (str == null || str.trim().length() == 0) {
			return true;
		}
		return false;
	}
	
	/**
	 * 若str==null,或str中each code<='\u005Cu0020'(the space character),返回true。
	 *
	 * @param object
	 * @return
	 */
	public static boolean isEmpty(Object object) {
		String str = null;
		str = (object == null ? null : object.toString());
		
		if (str == null || str.trim().length() == 0) {
			return true;
		}
		return false;
	}
	
	/**
	 * 若object中含有信息,则返回true。
	 *
	 * @param
	 * @return
	 * @author cjw 2020-03-27
	 */
	public static boolean isNotEmpty(Object object) {
		return !isEmpty(object);
	}
	
	/**
	 * 返回一个object的字符串表示,不返回null。 <br>
	 * 返回object的字符串表示str。若str==null,或str中each code<='\u005Cu0020'(the space
	 * character),返回""。
	 *
	 * @param object
	 * @return snail 2018-12-26
	 */
	public static String getStrNotNullFromObject(Object object) {
		String return_str = null;
		return_str = StrUtil.isEmpty(object) ? "" : object.toString();
		return return_str;
	}
	
	/**
	 * 返回一个object的字符串表示。若str==null,或str中each code<='\u005Cu0020'(the space
	 * character),返回null。
	 *
	 * @return cjw 2018-12-26
	 */
	public static String getStrFromObject(Object object) {
		String str = StrUtil.isEmpty(object) ? null : object.toString().trim();
		return str;
	}
	
	/**
	 * 清洗str：根据分隔符(,|\\||\n)切分str,过滤掉空字符串(不含信息),并返回子字符串列表。
	 *
	 * @param
	 * @return
	 * @author cjw 2019-07-19
	 */
	public static List<String> splitExtractFromStr(String str) {
		if (str == null) {
			return null;
		}
		String[] str_array = str.trim().split(",|\\||\n");
		List<String> list_str = new ArrayList<>();
		
		for (String subStr : str_array) {
			if (!StrUtil.isEmpty(subStr)) {
				list_str.add(subStr.trim());
			}
		}
		return list_str;
	}
	
	/**
	 * 清除list_str中的重复记录。
	 *
	 * @param
	 * @return
	 * @author cjw 2019-07-24
	 */
	public static List<String> removeDuplicateRecord(List<String> list_str) {
		if (list_str == null) {
			return list_str;
		}
		
		List<String> list_strNew = new ArrayList<>();
		for (String str : list_str) {
			//若list_strNew不含有str
			if (!list_strNew.contains(str)) {
				list_strNew.add(str);
			}
		}
		return list_strNew;
	}
	
	/**
	 * 将字符串str转化为固定长度字符串str_new。
	 * 返回字符串的格式为：《AA...》
	 *
	 * @param
	 * @return
	 * @author cjw 2019-07-25
	 */
	public static String truncateStrToFixedLength(String str, int fixedLength) {
		if (StrUtil.isEmpty(str)) {
			return null;
		}
		
		if (str.length() <= fixedLength) {
			return str;
		} else {
			String strNew = null;
			strNew = str.substring(0, fixedLength) + "...";
			return strNew;
		}
	}
	
	/**
	 * 将list_str转化为字符串,并使用separator分隔符。若字符串含有内容时, 返回字符串的末尾含有分隔符。
	 *
	 * @param
	 * @return
	 * @author cjw 2019-07-29
	 */
	public static String convertList2Str(List<String> list_str, String separator) {
		if (list_str == null) {
			return null;
		}
		
		StringBuffer strBuff = new StringBuffer();
		for (String str : list_str) {
			strBuff.append(str + separator);
		}
		return strBuff.toString();
	}
	
	/**
	 * 将list_str转化为字符串,并使用separator分隔符，返回字符串末尾不含有分隔符。
	 *
	 * @param
	 * @return
	 * @author cjw 2019-07-29
	 */
	public static String convertList2StrV2(List<String> list_str, String separator) {
		if (list_str == null) {
			return null;
		}
		
		StringBuffer strBuff = new StringBuffer();
		for (String str : list_str) {
			strBuff.append(str + separator);
		}
		String strReturn = strBuff.toString();
		//去除末尾的分隔符
		if (strReturn.length() > 0) {
			strReturn = strReturn.substring(0, strReturn.length() - separator.length());
		}
		return strReturn;
	}
	
	/**
	 * 从list_t中获取一个对象，并且当list_t包含多个对象(list_t.size()>1)时抛出异常。
	 *
	 * @param
	 * @return
	 * @author cjw 2019-09-02
	 */
	public static <T> T getItemFromList(List<T> list_t) {
		if (list_t == null) {
			return null;
		}
		if (list_t.size() == 0) {
			return null;
		}
		if (list_t.size() == 1) {
			return list_t.get(0);
		}
		if (list_t.size() > 1) {
			throw new RuntimeException("list_t中的对象数量应<=1,此处的对象数量超过了1!");
		}
		return null;
	}
	
	/**
	 * 分析字符串中是否含有数字。
	 *
	 * @param
	 * @return
	 * @author cjw 2019-09-27
	 */
	public static boolean hasDigit(String str) {
		if (StrUtil.isEmpty(str)) {
			return false;
		}
		
		String digitStr = "0123456789";
		for (int i = 0; i < str.length(); i++) {
			if (digitStr.contains(String.valueOf(str.charAt(i)))) {
				return true;
			}
		}
		return false;
	}
	
	/**
	 * 比较两个字符串是否相等,此处为严格比较。
	 *
	 * @param
	 * @return
	 * @author cjw 2020-03-28
	 */
	public static boolean equalStrict(String str_1, String str_2) {
		if (str_1 == null && str_2 == null) {
			return true;
		}
		if (str_1 == null || str_2 == null) {
			return false;
		}
		boolean isEqual = str_1.equals(str_2);
		return isEqual;
	}
	
	/**
	 * 分析该字符串是否以"/|\"结尾。
	 *
	 * @param
	 * @return
	 * @author cjw 2020-04-22
	 */
	public static boolean EndsWithFileSeparator(String str) {
		if (StrUtil.isEmpty(str)) {
			return false;
		}
		
		if (str.endsWith("/") || str.endsWith("\\")) {
			return true;
		} else {
			return false;
		}
	}
	
	
}
